﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace GA
{
    public class CicloGA
    {
        public Perfil Perfil { get; set; }
        public Populacao Populacao { get; set; }
        public int Threshold { get; set; }

        public CicloGA(Perfil perfilDoUsuario, int threshold) 
        {
            Threshold = threshold;
            Perfil = perfilDoUsuario;
            Populacao = new Populacao();
            Populacao.InicializarPopulacao();
        }

        public List<Musica> iteracoesGA()
        {
            int i = 0;
            foreach (Individuo individuo in Populacao.Individuos)
            {
                individuo.CalcularFitness(Perfil);
            }
            while (!Populacao.Individuos.Exists(r => r.Fitness > Threshold) && i < 200000) 
            {                
                Populacao.PermutacaoIntraPopulacao(Perfil);
                Populacao.PermutacaoIndividual(Perfil);
                foreach (Individuo individuo in Populacao.Individuos)
                {
                    individuo.CalcularFitness(Perfil);
                }
                i++;
            }
            List<Individuo> individuosOrdenados = Populacao.Individuos.OrderBy(ind => ind.Fitness).ToList();
            return individuosOrdenados.Last().PlayList;
        }



    }
}
